
import time
from typing import Optional
from pydantic import BaseModel, field_validator


class Person(BaseModel):
    """
    Person类用于表示一个人的基本信息，包括ID、姓名、公司名称、职位、性别、籍贯、出生年龄和学历。
    
    核心功能包括：
    - 验证性别、籍贯、出生年龄和学历的数据类型和内容
    - 发送数据到指定的Web API
    
    使用示例：
    
    构造函数参数：
    - person_id: 人的唯一标识符，类型为str
    - name: 人的姓名，类型为str
    - company_name: 人的公司名称，类型为str
    - position: 人的职位，类型为str
    - gender: 人的性别，类型为Optional[str]，默认值为None
    - native_place: 人的籍贯，类型为Optional[str]，默认值为None
    - birth_age: 人的出生年龄，类型为Optional[int]，默认值为None
    - education: 人的学历，类型为Optional[str]，默认值为None
    
    注意：
    - 性别必须是"男"或"女"
    - 籍贯必须是字符串
    - 出生年龄必须是正整数
    - 学历必须是字符串
    - send_to_api方法模拟发送数据到Web API的耗时，如果person_id为'36e1fc7d-758d-4bdd-b35e-13f7b8997545'，则会模拟发送失败
    """
    
    person_id: str
    name: str
    company_name: str
    position: str
    gender: Optional[str] = None
    native_place: Optional[str] = None
    birth_age: Optional[int] = None
    education: Optional[str] = None

    @field_validator('gender') 
    def validate_gender(cls, v):
        if v not in ['男', '女']:
            raise ValueError('性别必须是"男"或"女"')
        return v

    @field_validator('native_place')
    def validate_native_place(cls, v):
        if not isinstance(v, str):
            raise ValueError('籍贯必须是字符串')
        return v

    @field_validator('birth_age')
    def validate_birth_age(cls, v):
        if not isinstance(v, int) or v < 0:
            raise ValueError('出生年龄必须是正整数')
        return v

    @field_validator('education')
    def validate_education(cls, v):
        if not isinstance(v, str):
            raise ValueError('学历必须是字符串')
        return v
    
    # 增加一个方法，用于将数据发送到某个web api
    def send_to_api(self, api_url): 
        # TODO: 实现发送数据到web api的逻辑
        # 暂时用time.sleep模拟发送数据到web api的耗时
        if self.person_id == '36e1fc7d-758d-4bdd-b35e-13f7b8997545':
            raise Exception('模拟发送数据到web api失败')
        time.sleep(1)
        return True
